#include "waveWidget.h"
#include "ui_waveWidget.h"


#include <iostream>

#include <QLabel>
#include <QMessageBox>
#include <QCloseEvent>


WaveWidget::WaveWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::WaveWidget)
{
    ui->setupUi(this);

    m_countGraph = TCPEEG_CHANNEL_COUNT;
    pointNumPerLine = 3000;
    plot_index = 0;

    plotInit();
    begin_plot();
}

void WaveWidget::closeEvent(QCloseEvent *event)
{
    emit widgetClose(WINID::WaveWidget);
    std::cout << "wave Windows is closed!" << std::endl;
}

WaveWidget::~WaveWidget()
{
    rePlotTimer.stop();
    dataTimer_wave.stop();
    delete ui;
    // std::cout << "~WaveWidget()" << std::endl;
}

/**********************************
 * 函数名：plotInit
 * 功能：画图窗口初始化
 * 输入：无
 * 输出：无
 * 备注：无
**********************************/

int WaveWidget::plotInit(){
    customPlot = ui->wave_plot;

    // 四边安上坐标轴
    customPlot->axisRect()->setupFullAxesBox();
    // 使上下轴、左右轴范围同步
    connect(customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), customPlot->xAxis2, SLOT(setRange(QCPRange)));
    connect(customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), customPlot->yAxis2, SLOT(setRange(QCPRange)));
    // 窗口刷新
    connect(&rePlotTimer, SIGNAL(timeout()), this, SLOT(timeToRePlot()));
    // 添加数据
    // connect(&dataTimer_wave, SIGNAL(timeout()), this, SLOT(add_randomData()));
    connect(&dataTimer_wave, SIGNAL(timeout()), this, SLOT(add_eegData()));

    customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
    m_start_wave = false;

    return 0;
}

/**********************************
 * 函数名：begin_plot
 * 功能：
 * 输入：无
 * 输出：无
 * 备注：无
**********************************/
void WaveWidget::begin_plot(){
    // if(!m_start_wave)
    if(1)
    {
        eegData_voltage.clear();
        plot_index = 0;

        customPlot->clearGraphs();//清除所有graph
        QPen pen;
        pen.setWidth(1);
        //添加曲线
        for(int i=0; i<m_countGraph; ++i)
        {
            customPlot->addGraph();
            //颜色随机
            pen.setColor(QColor(qrand()%150+100,qrand()%150+100,qrand()%150+100));
            customPlot->graph(i)->setPen(pen);//
        }
        //设置y轴范围
        customPlot->yAxis->setRange(-1, m_countGraph*2);
        //设置x轴范围
        // int size = ui->spinBox2->value();
        int size = pointNumPerLine;
        customPlot->xAxis->setRange(0, size, Qt::AlignRight);
        //定时添加和刷新数据
        rePlotTimer.start(16); // 间隔16ms刷新一次
        dataTimer_wave.start(5); // 间隔时间5ms添加一次数据
        m_start_wave = true;
        // ui->btn_start2->setText("停止");
    }
    else
    {
        rePlotTimer.stop(); // 停止重绘
        dataTimer_wave.stop(); // 停止添加数据
        m_start_wave = false;
        // ui->btn_start2->setText("开始");
    }
}

/**********************************
 * 函数名：
 * 功能：
 * 输入：无
 * 输出：无
 * 备注：无
**********************************/
void WaveWidget::receive_eegData(const std::vector<EEG_VOLTAGE>& data){
    // std::cout << "in receive_eegData:" << std::endl;
    eegData_voltage.insert(eegData_voltage.end(), data.begin(), data.end());
    // for(int i=0; i<1; ++i)
    // {
    //     for(int j=0; j<data.size(); ++j)
    //     {
    //         customPlot->graph(i)->addData(customPlot->graph(i)->dataCount(), 
    //                                         data.at(j).data[25]);
    //     }
    // }
}

/**********************************
 * 函数名：
 * 功能：
 * 输入：无
 * 输出：无
 * 备注：无
**********************************/
// void WaveWidget::add_eegData(const std::vector<EEG_VOLTAGE>& data){
void WaveWidget::add_eegData(){
    int new_dataSize = eegData_voltage.size()-plot_index;
    // std::cout << "new_dataSize:" << new_dataSize << std::endl;
    // for(int i=0; i<1; ++i)
    for(int i=0;i<customPlot->graphCount();i++)
    {
        for(int j=0; j<new_dataSize; ++j)
        {
            customPlot->graph(i)->addData(customPlot->graph(i)->dataCount(), 
                                            eegData_voltage.at(j+plot_index).data[i]+1000*i); // 1000*i表示每个通道在图中隔开1000uV
            // std::cout << "eegData_voltage:" << eegData_voltage.at(j+plot_index).data[25] << std::endl;
        }
    }
    plot_index = eegData_voltage.size();
}

/**********************************
 * 函数名：add_randomData
 * 功能：往曲线中添加随机数
 * 输入：无
 * 输出：无
 * 备注：无
**********************************/
void WaveWidget::add_randomData()
{
    QTime time= QTime::currentTime();
    qsrand(time.msec()+time.second()*1000);//随机数种子
    for(int i=0;i<customPlot->graphCount();i++)
    {
        for(int j=0;j<10;j++)//每次添加10个数据
        {
            customPlot->graph(i)->addData(customPlot->graph(i)->dataCount(),qrand()/(double)RAND_MAX + i*2);
        }
    }
}

/**********************************
 * 函数名：timeToRePlot
 * 功能：刷新
 * 输入：无
 * 输出：无
 * 备注：无
**********************************/ 
void WaveWidget::timeToRePlot()
{
    static QTime time(QTime::currentTime());
    double key = time.elapsed()/1000.0; // time elapsed since start of demo, in seconds
    // 每次刷新pointNumPerLine个点,右对齐
    customPlot->xAxis->setRange(customPlot->graph(0)->dataCount(), pointNumPerLine, Qt::AlignRight);
    
    // QEventLoop loop;//定义一个新的事件循环
    // QTimer::singleShot(1000, &loop, SLOT(quit()));//创建单次定时器，槽函数为事件循环的退出函数
    // loop.exec();//事件循环开始执行，程序会卡在这里，直到定时时间到，本循环被退出
    //重绘
    customPlot->replot(QCustomPlot::rpQueuedReplot);
    //customPlot->replot();
    static double lastFpsKey;
    static int frameCount;
    ++frameCount;
    if (key-lastFpsKey > 1) // 每1s求一次值
    {
        float frame = frameCount / (key-lastFpsKey);
        lastFpsKey = key;
        frameCount = 0;
    }
}

void WaveWidget::on_btm_pause_clicked(bool checked){
    static bool pause_flag = false;

    if(pause_flag){
        ui->btm_pause->setText("Pause");
        //定时添加和刷新数据
        rePlotTimer.start(16); // 间隔16ms刷新一次
        dataTimer_wave.start(5); // 间隔时间5ms添加一次数据
        pause_flag = false;
    }

    else{
        ui->btm_pause->setText("Continue");
        //定时添加和刷新数据
        rePlotTimer.stop();
        dataTimer_wave.stop();
        pause_flag = true;
    }
}

void WaveWidget::on_btm_clear_clicked(bool checked){
    // customPlot->clearGraphs();
    // eegData_voltage.clear();
    // plot_index = 0;

    // for (int i = 0; i < customPlot->graphCount(); ++i) {
    //     customPlot->graph(i)->data().clear();
    // }
    begin_plot();
}

void WaveWidget::on_btm_collect_clicked(bool checked){

}

void WaveWidget::on_btm_record_clicked(bool checked){

}
void WaveWidget::on_btm_load_clicked(bool checked){

}